Skip to content

读取图片字节流 - GetImageData

函数简介

获取指定图像的二进制数据,数据格式BBGGRRAA(BGRA),每个像素4字节。

接口名称

GetImageData

DLL调用

int GetImageData(long ola, long ptr, long* data, int* size, int* stride);

参数说明

参数名类型说明
ola长整数型OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。
ptr长整数型OLAImage对象的地址。
data长整数型指针返回图片的数据指针。
size整数型指针返回图片的数据长度。
stride整数型指针返回图片的步长数据(每行数据字节数)。

示例

以下示例演示 从 OLAImage 句柄导出 BGRA 原始字节流并写入磁盘,以及 读回磁盘字节流再载入 的往返流程。推荐配合 GetScreenDataPtr 获取句柄(线程安全)。

SDK 调用

cpp
#include "OLAPlugServer.h"
#include <fstream>

OLAPlugServer ola;
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
    long dataPtr = 0; int size = 0, stride = 0;
    if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1) {
        std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size);
    }
    ola.FreeImage(imgPtr);
}
csharp
using System.IO;
using System.Runtime.InteropServices;
using OLAPlug;

var ola = new OLAPlugServer();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0)
{
    if (ola.GetImageData(imgPtr, out long dataPtr, out int size, out int stride) == 1)
    {
        byte[] bgra = new byte[size];
        Marshal.Copy((IntPtr)dataPtr, bgra, 0, size);
        File.WriteAllBytes(@"output\screen.bgra", bgra);
    }
    ola.FreeImage(imgPtr);
}
python
from OLAPlugServer import OLAPlugServer
import ctypes

ola = OLAPlugServer()
img_ptr = ola.GetScreenDataPtr(0, 0, 200, 200)
if img_ptr:
    ret, data_ptr, size, stride = ola.GetImageData(img_ptr)
    if ret == 1:
        with open("output/screen.bgra", "wb") as f:
            f.write((ctypes.c_char * size).from_address(data_ptr))
    ola.FreeImage(img_ptr)
java
import com.olaplug.OLAPlugServer;
import com.sun.jna.Pointer;
import java.nio.file.Files;
import java.nio.file.Paths;

OLAPlugServer ola = new OLAPlugServer();
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
    var data = ola.GetImageData(imgPtr);
    if (data != null && data.success) {
        byte[] bgra = new Pointer(data.data.data).getByteArray(0, data.data.size);
        Files.write(Paths.get("output/screen.bgra"), bgra);
    }
    ola.FreeImagePtr(imgPtr);
}
go
import "github.com/ola/olaplug/olaplug"

ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
imgPtr := ola.GetScreenDataPtr(0, 0, 200, 200)
if imgPtr != 0 {
    dataPtr := 0; int size = 0, stride = 0
    if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1) {
        std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size)
    }
    ola.FreeImage(imgPtr)
}
rust
use olaplug::OLAPlugServer;

let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let imgPtr = ola.get_screen_data_ptr(0, 0, 200, 200);
if imgPtr != 0 {
    let dataPtr = 0; int size = 0, stride = 0;
    if (ola.get_image_data(imgPtr, &mut dataPtr as *mut i32, &mut size as *mut i32, &mut stride as *mut i32) == 1) {
        std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size)
    }
    ola.free_image(imgPtr);
}
cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
if(imgPtr) {
    var ret = ola.GetImageData(imgPtr)
    ola.WriteBytesToFile("output/screen.bgra", ret.data, ret.size)
    ola.FreeImage(imgPtr)
}
vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
If imgPtr <> 0 Then
    ret = ola.GetImageData(imgPtr)
    ola.WriteBytesToFile "output/screen.bgra", ret(0), ret(1)
    ola.FreeImage(imgPtr)
End If
text
.局部变量 ola, OLAPlug
.局部变量 ret, 整数型
.局部变量 imgPtr, 长整数型
.局部变量 dataPtr, 长整数型
.局部变量 bgraData, 字节集
.局部变量 size, 整数型
.局部变量 stride, 整数型

ola.创建 ()
imgPtr = ola.GetScreenDataPtr (0, 0, 200, 200)
.如果真 (imgPtr ≠ 0)
    ret = ola.GetImageData (imgPtr, dataPtr, size, stride)
    .如果真 (ret = 1)
        bgraData = 指针到字节集 (dataPtr, size)
        写到文件 (“output/screen.bgra”, bgraData)
    .如果真结束
    ola.FreeImagePtr (imgPtr)
.如果真结束
aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if(imgPtr){
    var ret, dataPtr, size, stride = ola.GetImageData(imgPtr);
    if(ret == 1) string(dataPtr, size).save("output/screen.bgra");
    ola.FreeImage(imgPtr);
}
text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200)
如果真 (imgPtr ≠ 0)
{
    长整数 dataPtr = 0
    整数 size = 0, stride = 0, ret = 0
    ret = ola.GetImageData(imgPtr, dataPtr, size, stride)
    如果真 (ret = 1)
    {
        变量 bgraData <类型 = 字节集类>
        bgraData = 指针到字节集(dataPtr, size)
        写到文件("output/screen.bgra", bgraData)
    }
    ola.FreeImagePtr(imgPtr)
}
cpp
#include "OLAPlugServer.h"
#include <fstream>

OLAPlugServer ola;
long imgPtr = ola.GetScreenDataPtr(0, 0, 200, 200);
if (imgPtr != 0) {
    long dataPtr = 0; int size = 0, stride = 0;
    if (ola.GetImageData(imgPtr, &dataPtr, &size, &stride) == 1)
        std::ofstream("output/screen.bgra", std::ios::binary).write((const char*)dataPtr, size);
    ola.FreeImage(imgPtr);
}

原生 DLL 调用

cpp
long instance = CreateCOLAPlugInterFace();
long imgPtr = GetScreenDataPtr(instance, 0, 0, 200, 200);
if (imgPtr != 0) {
    long dataPtr = 0; int size = 0, stride = 0;
    if (GetImageData(instance, imgPtr, &dataPtr, &size, &stride) == 1) {
        WriteBytesToFile(instance, "output/screen.bgra", dataPtr, size);
    }
    FreeImagePtr(instance, imgPtr);  // 勿对 dataPtr 调用 FreeImageData
}
csharp
long imgPtr = GetScreenDataPtr(instance, 0, 0, 200, 200);
if (imgPtr != 0) {
    GetImageData(instance, imgPtr, out long dataPtr, out int size, out int stride);
    byte[] copy = new byte[size];
    Marshal.Copy((IntPtr)dataPtr, copy, 0, size);
    File.WriteAllBytes(@"output\screen.bgra", copy);
    FreeImagePtr(instance, imgPtr);
}
python
img_ptr = ola.GetScreenDataPtr(instance, 0, 0, 200, 200)
if img_ptr:
    data = c_int64(0); size = c_int(0); stride = c_int(0)
    ola.GetImageData(instance, img_ptr, byref(data), byref(size), byref(stride))
    raw = (c_char * size.value).from_address(data.value)
    open("output/screen.bgra", "wb").write(raw)
    ola.FreeImagePtr(instance, img_ptr)

返回值

返回值说明
1成功。
0失败。

注意事项

项目说明
数据格式BGRA(字节顺序 B-G-R-A),每像素 4 字节;width = stride / 4height = size / stride
生命周期GetImageData 返回的 data 与 OLAImage 句柄绑定,调用 FreeImagePtrdata 即失效;写盘或 memcpy 须在释放句柄 之前 完成。
释放内存不要GetImageDatadata 调用 FreeImageData(该接口用于 GetImageBmpData / GetScreenData* 等独立分配的缓冲)。
推荐写法GetScreenDataPtr + GetImageData + FreeImagePtr,替代线程不安全的 GetScreenData
各语言写盘先将 data 拷贝到语言原生字节数组再落盘(易语言 指针到字节集、C# Marshal.Copy、Python from_address 等);勿对 GetImageDatadata 调用 FreeImageData
格式若需标准图片文件,优先用 GetImageBmpData 导出 BMP。